
package projecto.pkgfinal;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;

public class RepositorioConsultas {
    private  String path = "Consultas.dat";
    private  File f = new File(path);
    private  ArrayList<Consulta> listaConsultas = new ArrayList<Consulta>();
    public  ArrayList<Consulta> getListaConsultas() { 
        return listaConsultas;
    }
    
    public void listarConsultas(){
        if(this.getListaConsultas().size()>0){
            for(Consulta consulta: this.getListaConsultas()){
                    System.out.print(consulta.toString());
                }
        }else{
            System.out.print("Não existem consultas em sistema\n");
        }
     }
     public  void carregarConsultas() {
        try {
                //se o ficheiro existe..
                if (f.exists()) {
                        FileInputStream streamIn = new FileInputStream(f);
                        ObjectInputStream in = new ObjectInputStream(streamIn);
                        listaConsultas = (ArrayList<Consulta>) in.readObject();
                }
        } catch (FileNotFoundException e) {
                e.printStackTrace();
        } catch (IOException e) {
                e.printStackTrace();
        } catch (ClassNotFoundException e) {
                e.printStackTrace();
        }

    }
 
  public  void gravarConsultas() {
        if (listaConsultas.size() > 0) {
                try {
                        //se nao existir o ficheiro..cria-se
                        if (!f.exists())
                                f.createNewFile();

                        FileOutputStream streamOut = new FileOutputStream(path);
                        ObjectOutputStream out = new ObjectOutputStream(streamOut);
                        //escreve o conteudo da lista no ficheiro
                        out.writeObject(listaConsultas);
                        out.flush();
                        out.close();
                } catch (FileNotFoundException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
                }
        }             

    }
    public boolean criarConsulta(Utente utente,Medico medico, Especialidade especialidade, String dia, String mes, String ano, String hora, String custo){
   
        
     int numeroconsulta = proximoId();  
     StringBuilder data = new StringBuilder();
     data.append(dia+"/");
     data.append(mes+"/");
     data.append(ano);
     //TODO verificar se existe ou nao consultas marcadas para esse medico
 if   ( verificaoDataConsultas(medico, data , hora, utente)){
     Consulta consulta = new Consulta(numeroconsulta, utente, medico, especialidade, String.valueOf(data), hora, Double.valueOf(custo));
     listaConsultas.add(consulta); 
     return true;
 }
 return false;
  }
    
    public void actualizarConsulta(int numeroconsulta, Utente utente, Medico medico, Especialidade especialidade, String data, String hora, double custo){
   int posicao = this.getConsultaIndex(numeroconsulta);
   
  listaConsultas.get(posicao).setCusto(custo);
  listaConsultas.get(posicao).setData(data);
  listaConsultas.get(posicao).setEspecialidadeId(especialidade);
  listaConsultas.get(posicao).setHora(hora);
  listaConsultas.get(posicao).setMedicoId(medico);
  listaConsultas.get(posicao).setNumeroConsulta(numeroconsulta);
  listaConsultas.get(posicao).setUtente(utente);
     
    
    }
    
    
         
    
     public int proximoId(){
        if(listaConsultas.isEmpty())
            return 1;
        int ultimo = listaConsultas.get(listaConsultas.size()-1).getNumeroConsulta();
        ultimo++;
        return ultimo;
    }
     public int getNumeroConsultas(){
        return listaConsultas.size();
    }
    public void listarConsulta(int campoDePesquisa,Integer idAPesquisar){    
        if(listaConsultas.size()>0){
            boolean flag=false;
            switch (campoDePesquisa){
                //Médico
                case 1: 
                    for(Consulta consulta: this.getListaConsultas()){
                        if(idAPesquisar==consulta.getMedico().getId()){
                                System.out.println(consulta.toString());
                                flag=true;
                        }
                    }
                    if(!flag)
                        System.out.println("\nNão existem consultas registadas para esse médico!\n");
                break;
                //Utente
                case 2:
                    for(Consulta consulta: this.getListaConsultas()){
                        if(idAPesquisar==consulta.getUtente().getId()){
                                System.out.println(consulta.toString());
                                flag=true;
                        }
                    }
                    if(!flag)
                        System.out.println("\nNão existem consultas registadas para esse utente!\n");
                break;
                //Especialidade
                case 3:
                    for(Consulta consulta: this.getListaConsultas()){
                        if(idAPesquisar==consulta.getEspecialidade().getCodigo()){
                                System.out.println(consulta.toString());
                                flag=true;
                        }
                    }
                    if(!flag)
                        System.out.println("\nNão existem consultas registadas para essa especialidade!\n");
                break;
            
            }
                
        } else
            System.out.println("\nREGISTO NAO ENCONTRADO!\n");
     }
   public void apagarConsulta(int consultaId,int pessoaId){
         int posicao = this.getConsultaIndex(consultaId);
         if(this.getListaConsultas().size()>0){
         if(this.getListaConsultas().get(posicao).getMedico().getId()==pessoaId && this.getListaConsultas().get(posicao).getNumeroConsulta()==consultaId)
            this.getListaConsultas().remove(posicao);
         else
          System.out.println("\nREGISTO NAO APAGADO!\n");   
         }else
             System.out.println("\nNão tem consultas marcadas!\n");
   }
   public void apagarConsulta(int consultaId){
         int posicao = this.getConsultaIndex(consultaId);
         if(this.getListaConsultas().size()>0){
         if(this.getListaConsultas().get(posicao).getNumeroConsulta()==consultaId)
            this.getListaConsultas().remove(posicao);
         else
          System.out.println("\nREGISTO NAO APAGADO!\n");   
         }else
             System.out.println("\nNão tem consultas marcadas!\n");
   }
   public int getConsultaIndex(int consultaId){
         if (getListaConsultas().size() > 0) {
                for (int i = 0; i < getListaConsultas().size(); i++) {
                        if (consultaId == getListaConsultas().get(i).getNumeroConsulta()) {
                                return i;
                        }
                }
                return 0;
		}
		return 0;
     }
    public void listarConsultaPorData(String data){    
        if(listaConsultas.size()>0){
            boolean flag=false;
            for(Consulta consulta: this.getListaConsultas()){
                if(data.equals(consulta.getData())){
                        System.out.println(consulta.toString());
                        flag=true;
                }
            }
            if(!flag)
                System.out.println("\nREGISTO NAO ENCONTRADO!\n");
        } else
            System.out.println("\nREGISTO NAO ENCONTRADO!\n");
     }
    
    public String getEspecialidade(int consultaId){
    int posicao=this.getConsultaIndex(consultaId);
    return this.listaConsultas.get(posicao).getEspecialidade().getNome();
    }
    public int getEspecialidadeId(int consultaId){
    int posicao=this.getConsultaIndex(consultaId);
    return this.listaConsultas.get(posicao).getEspecialidade().getCodigo();
    }
    
    public String getMedico(int consultaId){
    int posicao=this.getConsultaIndex(consultaId);
    return this.listaConsultas.get(posicao).getMedico().getNomeProprio();
    }
    
    public String getData(int consultaId){
    int posicao=this.getConsultaIndex(consultaId);
    return this.listaConsultas.get(posicao).getData();
    }
    public String getHora(int consultaId){
    int posicao=this.getConsultaIndex(consultaId);
    return this.listaConsultas.get(posicao).getHora();
    }
    public Double getCusto(int consultaId){
    int posicao=this.getConsultaIndex(consultaId);
    return this.listaConsultas.get(posicao).getCusto();
    }
    public int getUtente(int consultaId){
    int posicao=this.getConsultaIndex(consultaId);
    return this.listaConsultas.get(posicao).getUtente().getId();
    }
    
   public boolean existeConsulta(int campoDePesquisa,Integer idAPesquisar){    
       boolean flag=false;
       //TODO:  Verificar se a data da consulta é anterior ao dia da pesquisa, se for pode-se apagar a pessoa??
       if(listaConsultas.size()>0){
            switch (campoDePesquisa){
                //Médico
                case 1: 
                    for(Consulta consulta: this.getListaConsultas()){
                        if(idAPesquisar==consulta.getMedico().getId()){
                                flag=true;
                        }
                    }
                break;
                //Especialidade
                case 2:
                    for(Consulta consulta: this.getListaConsultas()){
                        if(idAPesquisar==consulta.getEspecialidade().getCodigo()){
                                flag=true;
                        }
                    }
                break;
                //Utente
                case 3:
                    for(Consulta consulta: this.getListaConsultas()){
                        if(idAPesquisar==consulta.getUtente().getId()){
                                flag=true;
                        }
                    }
                break;
            }
        }
       return flag;
     }  
   
  public boolean verificaoDataConsultas(Medico medico, StringBuilder data, String hora,Utente utente){
     boolean flag = true;
     int idmedico = medico.getId();
     int idutente = utente.getId();
     System.out.print("estou em verificar id medico: "+ idmedico);
     if(listaConsultas.size()>0){
         // ciclo para passar por todas as consultas
            for(Consulta consulta: this.getListaConsultas()){
             //    System.out.print("\nestou dentro do for ");
  //isto nao funca mas devia objectivo: comparar se a consulta é do medico que esta a entrar aqui!
                 if(consulta.getMedico().getId()==idmedico){
                  //  System.out.print("\nprimeira verificacao"); 
                    if((consulta.getData().equals(String.valueOf(data))&& consulta.getHora().equals(hora))){
                  //      System.out.print("\nsegunda verificacao");
                           System.out.println(consulta.toString());
                             System.out.print("hora ocupada no medico ");
                            flag=false;
                        }
                }
            }
            for(Consulta consulta: this.getListaConsultas()){
             //    System.out.print("\nestou dentro do for ");
  //isto nao funca mas devia objectivo: comparar se a consulta é do medico que esta a entrar aqui!
                 if(consulta.getUtente().getId()==idutente){
                  //  System.out.print("\nprimeira verificacao"); 
                    if((consulta.getData().equals(String.valueOf(data))&& consulta.getHora().equals(hora))){
                  //      System.out.print("\nsegunda verificacao");
                           System.out.println(consulta.toString());
                             System.out.print("hora ocupada no utente ");
                            flag=false;
                        }
                }
            }
            
            
            
            
            
            if(flag)
                System.out.println("\nhora disponivel!\n");
        } else
            System.out.println("\nhora disponivel\n");
       
             
    return flag;
}
}